package cnsatmsmart.automation.mmi.model.data;

import cnsatmsmart.automation.mmi.model.data.TSafe.Point4D;
import java.util.HashMap;
import java.util.Map;

/**
 * @author SIK - PTIK, BPPT
 **/

public class FlightTrackHistory {
    /* const */
        private static final int MAX_TRAIL_POINT = 5;
            //nilai default untuk jumlah titik maksimum yang menyatakan jalur yang dilewati oleh pesawat
        private static final long MAX_TRAIL_LENGTH = 5 * 60;    //5 MINUTES
            //nilai default untuk waktu maksimum yang menyatakan jalur yang dilewati oleh pesawat
        private static final long MIN_TRAIL_LENGTH = 1 * 60;    //1 MINUTES
            //nilai default untuk waktu minimum yang menyatakan jalur yang dilewati oleh pesawat

    /* atribut - atribut yang dimiliki oleh kelas FlightTrackHistory */
        private Map < String, Point4D[] > track = new HashMap < String, Point4D[] >();  //list yang terdiri atas pasangan ID penerbangan dengan pemetaan jalurnya
        private long length;                                                            //waktu tempuh pesawat
        private int point;                                                              //titik tempuh pesawat

    /* constructor - user defined ctor, no default ctor */
        // <editor-fold defaultstate="collapsed" desc="ctor">
        /*
         * @param = atribut
         */
        public FlightTrackHistory (long length, int point) {
            this.length = (length > MAX_TRAIL_LENGTH ? MAX_TRAIL_LENGTH : (length < MIN_TRAIL_LENGTH ? MIN_TRAIL_LENGTH : length));
            this.point = (((point <= 0) || (point > MAX_TRAIL_POINT)) ? MAX_TRAIL_POINT : point);
        }
        // </editor-fold>

    /* setter */
        public void set (String flightUID, Point4D flightPos) {
            /* I.S. sebarang */
            /* F.S. this.latitude terdefinisi dan bernilai sama dengan parameter lat DAN this.longitude terdefinisi dan bernilai sama dengan parameter lon */
            /* Proses : mengisikan dan mengubah nilai this.latitude DAN this.longitude dengan parameter lat DAN lon */
                if (! this.track.containsKey(flightUID)) { //new flight item
                    Point4D[] pos = new Point4D[MAX_TRAIL_POINT];
                    pos[0] = flightPos;

                    this.track.put(flightUID, pos);
                } else {                            //existing flight item
                    Point4D[] pos = this.track.get(flightUID);
                    if ((flightPos.getTime() - pos[0].getTime()) >= ((this.length * 1000l) / (long)this.point)) {
                        for (int i = 0; i < pos.length; ++i) {
                            int index = (pos.length - 1) - i;
                            if (i == (pos.length - 1)) {
                                pos[index] = flightPos;
                            } else {
                                pos[index] = pos[(index - 1)];
                            }
                        }

                        this.track.put(flightUID, pos);
                    }
                }
        }

    /* getter */
        public Point4D[] get (String flightUID) {
            /* mengembalikan nilai pemetaan dari atribut map yang mana memiliki kunci = flightUID */
            return (this.track.containsKey(flightUID) ? this.track.get(flightUID) : null);
        }

    /* method - method yang dimiliki oleh kelas FlightTrackHistory */
        public void remove (String flightUID) {
            /* menghapus dari list pada atribut map pasangan dengan kunci = flightUID */
            if (this.track.containsKey(flightUID)) {
                this.track.remove(flightUID);
            }
        }
}
